package com.yuexun.concurrency.singletom;

import com.yuexun.concurrency.annoations.NotRecommend;
import com.yuexun.concurrency.annoations.ThreadSafe;
import lombok.extern.slf4j.Slf4j;

/*懒汉模式
* 单例的实例在第一次使用时进行创建
* 这个模式在单线程的时候没有问题*/
/*多线程安全,恶汉模式,在类装载的时候进行创建,但是可能引起性能问题*/
@Slf4j
@ThreadSafe
@NotRecommend
public class SingletonExanple {
    //只有构造函数私有了,外面才不能不断通过new来创造新的对象
    private SingletonExanple(){
    }
    //定义一个单例对象,每次使用对象只能返回这一个
    private static SingletonExanple index =  null;
    //恶汉模式 private static SingletonExanple hangle = new SingletonExanple();
    //静态的工厂方法获取单例对象
    //当懒汉模式引入synchronize的时候,可变成线程安全的.但是因为一次只允许一个线程,会让性能降低,不推荐
    public static synchronized SingletonExanple getIndex(){
        if(index == null){
            index = new SingletonExanple();
        }
        //恶汉模式,直接return,不需要判断
        return index;
    }

}
